import DataType from "utils/DataType";

const ObjectUtils = {
	//冻结对象
	freeze(obj) {
		return Object.freeze(obj);
	},
	//判断对象是否被冻结
	isFrozen(obj) {
		return Object.isFrozen(obj);
	},
	//解冻对象
	unFreeze(obj) {
		return Object.assign({}, obj);
	},
	//深度进行冻结  回调冻结
	deepFreeze(obj) {
		//获取对象的全部属性
		let objNames = Object.getOwnPropertyNames(obj);
		//此时的getOwnPropertyNames属性是获取对象的全部属性名
		console.log(objNames); //输出的结果是一个obj属性名的字符串数组
		//对每个属性进行遍历如果属性是对象且不为空就将他冻结
		objNames.forEach(name => {
			//这里用到了es6的属性表达式 如obj.a=obj["a"]
			let prop = obj[name];
			console.log(prop);
			//在这里对每个属性进行判断 判断是否为对象
			if (typeof prop === "object" && prop !== null) {
				//如果是则递归进行下一层
				this.deepFreeze(prop);
			}
		});
		//冻结
		return Object.freeze(obj);
	},
	//对象深度克隆
	deepClone(target, source) {
		if (!DataType.isObject(target) || !DataType.isObject(source)) {
			return target;
		}
		for (let i in source) {
			if (target.hasOwnProperty(i)) {
				target[i] = DataType.isObject(source[i]) ? this.deepClone(target[i], source[i]) : source[i];
			} else {
				target[i] = source[i];
			}
		}
		return target;
	}
};
export default ObjectUtils;
